from multiprocessing import Queue
from multiprocessing import Process

#1 创建队列
if __name__ == '__main__':
    # 创建队列
    q = Queue(3)    # 最多可以接受三条信息
    print('队列是否为空：', q.empty())
    print('队列是否为满：', q.full())

    # 入队-向队列添加信息
    q.put('hello')
    q.put('world')
    print('队列是否为空：', q.empty())
    print('队列是否为满：', q.full())
    q.put('python')
    print('队列是否为空：', q.empty())
    print('队列是否为满：', q.full())
    print('队列中的信息的个数：', q.qsize())

    # 出队
    print(q.get())      # 先进队先出队
    print('队列中的信息的个数：', q.qsize())

    # 遍历队列
    if not q.empty():
        for i in range(q.qsize()):
            print(q.get_nowait())

#2 队列满时，还入队
if __name__ == '__main__':
    q = Queue(3)
    q.put('hello')
    q.put('world')
    q.put('python')

    # 此时队列已满
    # q.put_nowait('html')    # 报错，队列已满
    # q.put('html')    # 不报错。程序会一直等待，不结束，直到等到队列有空位
    q.put('html', block=True, timeout=2)    #等待两秒，如果队列仍然没有空位，报错

#3 使用队列，实现进程之间的通信问题
import time
a = 100
# 入队
def write_msg(q):   # q是队列
    global a
    if not q.full():
        for i in range(6):
            a -= 10
            q.put(a)
            print('入队时a的值：', a)
# 出队
def read_msg(q):
    time.sleep(1)
    while not q.empty():
        print('出队时a的值：', q.get())

if __name__ == '__main__':
    print('父进程开始执行')
    q = Queue()  # 由父进程创建队列。没有指定参数，说明可接收消息的个数没有上限
    p1 = Process(target=write_msg, args=(q,))
    p2 = Process(target=read_msg, args=(q,))

    p1.start()
    p2.start()

    p1.join()
    p2.join()
    print('父进程执行结束')
